package org.example.model;

import lombok.Data;
import org.example.model.enums.*;
import org.example.util.StrategyEnumUtils;
import org.springframework.core.annotation.AnnotationUtils;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author: Ran
 * @Date: 2021/9/22
 **/
@Data
public class SimStrategyOption {
    /**
     * 是否是商品布局
     */
    @FieldSort(0)
    private TrueFalseEnum tradeLayout;
    /**
     * 是否需要期初库存洗牌 商品布局
     */
    @FieldSort(1)
    private TrueFalseEnum inventoryShuffle;
    /**
     * 补货量 是否需要 上游库存修正 商品布局
     */
    @FieldSort(2)
    private TrueFalseEnum useUpFlowPoFix;

    /**
     * 补货量 最小起订量 修正 体积 重量
     */
    @FieldSort(3)
    private TrueFalseEnum useMinOrderQty;

    /**
     * 是否 使用upload 理解为upload 数据 线下poc
     */
    @FieldSort(4)
    private TrueFalseEnum useUpload;

    /**
     * 履约规则
     */
    @FieldSort(5)
    private FulfillRuleEnum fulfillRule;

    /**
     * 使用backorder策略
     */
    @FieldSort(6)
    private BoFulfillRuleEnum boFulfillRule;

    /**
     * 是否使用bod 线下poc 统一使用 bod
     */
    @FieldSort(7)
    private TrueFalseEnum useBod;

    /**
     * 补货量 使用箱规修正逻辑
     */
    @FieldSort(8)
    private TrueFalseEnum useCartonSpecFix;

    /**
     * 是否为0库存 做期初库存回填
     */
    @FieldSort(9)
    private TrueFalseEnum fillForZeroInv;

    /**
     * 安全库存策略 是否保留大单
     */
    @FieldSort(10)
    private SafetyStockCalRuleEnum safetyStockCalRule;

    /**
     * 进销存规则 是否先出后入 可以理解为先履约后补调单入库存
     */
    @FieldSort(11)
    private InOutRuleEnum inOutRule;

    /**
     * 商品分类管理
     */
    @FieldSort(12)
    private GoodsClassifyEnum goodsClassify;

    /**
     * 补货场景
     */
    @FieldSort(13)
    private SceneEnum replenishScene;

    /**
     * 履约来源枚举
     */
    @FieldSort(14)
    private FulfillSourceEnum fulfillSource;

    /**
     * 补货触发条件策略
     */
    @FieldSort(17)
    private ReplenishTriggerEnum replenishTrigger;

    /**
     * 寻源策略
     */
    @FieldSort(18)
    private SourceFindingRuleEnum sourceFindingRule;

    /**
     * 补货量计算
     */
    @FieldSort(19)
    private ReplenishCalRuleEnum replenishCalRule;

    /**
     * bo补调单下单时间判断 默认每日下单
     */
    @FieldSort(20)
    private BoReplenishEnum boReplenish;

    /**
     * 预测日滚动
     */
    @FieldSort(21)
    private TrueFalseEnum forecastRoll;

    /**
     * 安全库存范围是否启用
     */
    @FieldSort(22)
    private TrueFalseEnum safetyStockScope;

    /**
     * 完美分支
     */
    @FieldSort(38)
    private TrueFalseEnum perfectBranch;

    /**
     * 五菱分支
     */
    @FieldSort(39)
    private TrueFalseEnum wuLingBranch;

    /**
     * 封装返回
     *
     * @param optionStr
     * @return
     */
    public static Map<String, String> createOption(String optionStr) {

        Map<String, String> maps = new HashMap<>();
        String[] optionArr = optionStr.split("");
        Class<?> clz = SimStrategyOption.class;
        Field[] fields = clz.getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            FieldSort fieldSort = AnnotationUtils.findAnnotation(field, FieldSort.class);
            try {
                maps.put(field.getName(), StrategyEnumUtils.getCnNameByEnumCode(field.getType(), Integer.valueOf(optionArr[fieldSort.value()])));
            } catch (Exception e) {
            }
        }
        return maps;
    }

}

@Documented
@Inherited
@Target(value = {ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
/**
 * 字段排序注解
 * @author songxiulu
 */
@interface FieldSort {
    /**
     * 排序值
     */
    int value() default 0;
}